package modelo.dominio;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name ="Veiculo")
public class Veiculo implements Serializable {
	
	@Id
	@Column(unique=true, nullable=false)
	private String placa;
	
	@Column(length=25, nullable=false)
	private String modelo;
	
	@Column(length=20, nullable=false)
	private String marca;
	
	@Column(length=25)
	private String cor;
	
	@Column(length=25)
	private String opcionais;
	
	@Column(length=50)
	private String observacoes;
	
	@Column(nullable=false)
	private boolean disponivel;
	
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="idTipoVeiculo")	
	@Fetch(FetchMode.JOIN)
	private TipoVeiculo tipoVeiculo;
	
	@OneToMany(mappedBy="veiculo")
	private List<Locacao> listaLocacoes = new ArrayList<Locacao>();
	
	@Column
	private int quantLocacao;
	
	@Column
	private double valorLocacoes;
	
     public Veiculo(){}
        
	public Veiculo(String placa) {
		this.placa = placa;
	}
	
	public Veiculo(TipoVeiculo tipoVeiculo){
		this.tipoVeiculo = tipoVeiculo;
	}
	
	public Veiculo(String modelo, String placa, String marca, String cor, String opcionais, String observacoes, boolean disponivel,
		int quantLocacao, double valorLocacoes, TipoVeiculo tipoVeiculo) {
		this(placa);
		this.modelo = modelo;
		this.cor = cor;
		this.marca = marca;
		this.observacoes = observacoes;
		this.opcionais = opcionais;
		this.disponivel = disponivel;
		this.quantLocacao = quantLocacao;
		this.valorLocacoes = valorLocacoes;
		this.tipoVeiculo = tipoVeiculo;
	}
	
	public String getModelo (){
		return modelo;
	}
	public void setModelo (String modelo){
		this.modelo = modelo;
	}
	
	public String getPlaca (){
		return placa;
	}
	public void setPlaca (String placa){
		this.placa = placa;
	}
	
	public String getMarca (){
		return marca;
	}
	public void setMarca (String marca){
		this.marca = marca;
	}
	
	public String getCor (){
		return cor;
	}
	public void setCor (String cor){
		this.cor = cor;
	}
	
	public String getOpcionais (){
		return opcionais;
	}
	public void setOpcionais (String opcionais){
		this.opcionais = opcionais;
	}
	
	public String getObservacoes (){
		return observacoes;
	}
	public void setObservacoes (String observacoes){
		this.observacoes = observacoes;
	}
	
	public boolean isDisponivel (){
		return disponivel;
	}
	public void setDisponivel (boolean disponivel){
		this.disponivel = disponivel;
	}
	
	public int getQuantLocacao (){
		return quantLocacao;
	}
	public void setQuantLocacao(int quantLocacao){
		this.quantLocacao = quantLocacao;
	}
	
	public double getValorLocacoes (){
		return valorLocacoes;
	}
	public void setValorLocacoes(double valorLocacoes){
		this.valorLocacoes = valorLocacoes;
	}
	
     public TipoVeiculo getTipoVeiculo(){
          return tipoVeiculo;
     }
        
     public void setTipoVeiculo( TipoVeiculo tipoveiculo){
          this.tipoVeiculo= tipoveiculo;
     }
	
	public void addQuantLocacao(){
		this.quantLocacao++;
	}
	
	public void addValorLocacao(double valorLocacao){
		this.valorLocacoes += valorLocacao;
	}

	@Override
	public String toString() {
		return "Marca: " + this.marca +
			  "\nModelo: " + this.modelo +
			  "\nPlaca: " + this.placa +
			  "\nCor: " + this.cor +
			  "\nOpcionais: " + this.opcionais +
			  "\nCategoria: " + this.tipoVeiculo.getCategoria() +
			  "\nNúmero de locações: " + this.quantLocacao +
			  "\nRentabilidade: " + this.valorLocacoes +
			  "\nDisponível: " + this.disponivel +
			  "\nObservações: " + this.observacoes;
	}
	
	
}
